<?php namespace Home\Controller;
use Hdphp\Controller\Controller;
class ListController extends Controller{
	
	public function index(){
		$cid=Q('get.cid',0,'intval');
		//		获得所有分类
		$catedata=Db::table('category')->get();
		//		获得当前的分类和子分类
		$cids=$this->cidGetSon($catedata, $cid);
		//		把自身压入数组
		$cids[]=$cid;
//				sp($cids);die;
		//		获得分类所对应的商品
		$gids=$this->cidGetGid($cids);
//		sp($catedata);die;
		//		1根据分类获得商品gid
		$gids=$this->cidGetGid($cids);
//		sp($gids);die;
//		2根据gids获得商品的属性
		$goodsAttr=$this->getGoodsAttr($gids);
//		sp($goodsAttr);die;
		View::with('goodsattr',$goodsAttr);
//		3筛选地址处理器
//		获得数组长度
//count — 计算数组中的单元数目或对象中的属性个数 
		$num=count($goodsAttr);
//		当分类先没有商品时进行的判断
		if($num){
//			sp($_GET);die;
			/*Array
			(
			    [m] => Home
			    [c] => List
			    [a] => index
			    [cid] => 25
			)*/
//			array_fill — 用给定的值填充数组 
//			$_GET['param']如果存在就把它转化为字符串，不存在就把它转化为0
//param 参数
			$param=isset($_GET['param']) ? explode('_', $_GET['param']):array_fill(0,$num,0);
//			sp($param);die;
		}else{
			$param=array();
		}
		View::with('param',$param);
//		4根据商品属性id进行筛选商品
		$endgids=$this->filterGid($param,$gids);
//		sp($endgids);die;
//		5通过商品id找商品
		$goodsdata=Db::table('goods')->where('gid in('.implode(',', $endgids).')')->get();
		View::with('goodsdata',$goodsdata);
//		sp($gooddata);die;
		
		//		加载页面
		View::make();
	}
	
	//	获得当前分类的子分类和自己
	public function cidGetSon($data,$cid){
		$temp=array();
		foreach($data as $v){
//			循环数组，如果数组中的pid=提交的cid,把他放入空数组中
			if($v['pid']==$cid){
				$temp[]=$v['cid'];
				$temp=array_merge($temp,$this->cidgetSon($data,$v['cid']));
			}
		}
		
		return $temp;
	}
	
//	根据cid获得当前分类对应的gid
public function cidGetGid($cids){
	//	调取当前分类的所有子类
	//	实例化模型类
	$goods=new \Common\Model\Goods;
	$gids=$goods->where("category_cid in(".implode(',', $cids).")")->lists('gid');
	return $gids;
}
//	通过商品gid获得商品的属性
	public function getGoodsAttr($gids){
//		如果分类下边商品存在
		if($gids){
			//		groupBy通过分组，能去除重复的
			$goodsAttr=Db::table('goodsattribute')->where("goods_gid in(".implode(',',$gids).")")->groupBy('gavalue')->get();
	//		sp($goodsAttr);die;
	//		吧相同的类型归在一起
			$temp1=array();
			foreach($goodsAttr as $v){
				$temp1[$v['typeattribute_taid']][]=$v;
			}
	//		sp($temp1);
	//		通过类型的id得到对应的类型值
			$temp2=array();
			foreach($temp1 as $tk=>$tv){
				$name=Db::table('typeattribute')->where('taid',$tk)->pluck('taname');
	//			sp($name);
				$temp2[]=array(
				'name'=>$name,
				'value'=>$tv);
			}
//			sp($temp2);die;
			return $temp2;
		}else{
			return array();
		}

	}
//	fiter过滤
	private function filterGid($param,$cidGids){
		$gids=array();
		foreach ($param as $gaid){
//			如果不是“不限”的时候即$gaid!=0;
			if($gaid){
//				通过taid获得属性名称
				$name=Db::table('goodsattribute')->where('gaid',$gaid)->pluck('gavalue');
//				sp($name);die;
//				通过属性值查找商品gid
				$gids[]=Db::table('goodsattribute')->where('gavalue',$name)->lists('goods_gid');
//				sp($gids);die;
			}
		}
	
	//	如果点击任何一个筛选属性的时候/
		if($gids){
	//		吧获得好的商品gid取交集
			$gidsOne=$gids[0];
			foreach ($gids as $v){
	//			array_intersect — 计算数组的交集 ,返回一个数组
				$gidsOne=array_intersect($v, $gidsOne);
			}
	//		再查和分类相关的cidGid取交集
			$endgids=array_intersect($gidsOne, $cidGids);
			return $endgids;
		}else{
	//		如果全部点击不限的时候
			return $cidGids;
		}
	
	}
	
}
